/***************************************************************************
 *   Copyright (C) 2014 by UNEB- University of salvador Bahia,
 *   BRT3D
 *
 *   Autor: Edivã Goncalves
 *
 */


#ifndef AGENTE_H
#define AGENTE_H
#include <vector>


#include "../../Matematica/include/Matriz4d.h"
#include "../../Matematica/include/Coordenada3d.h"


class Agente{

	public:
	     //Agente();
		~Agente(){}


		/*Metodos para o Agente*/

		void iniList();

        void setTime(double);
        void setTimCaido(double);
        void setTimInici(double);
        void setNumeroReal(int);
		void setNumero(std::string);
		void setBoll(Matriz4d);
		void setStatus(bool);
		void setLado(std::string);
		void setPosseBola(bool);
		void contQuedas();
		void setPlayMode(std::string);

		void setHead(Matriz4d);
		void setBody(Matriz4d);

		void setRmupperarm(Matriz4d);
		void setRlowerarm(Matriz4d);

		void setLupperarm(Matriz4d);
		void setLlowerarm(Matriz4d);

		void setRthigh(Matriz4d);
		void setRshank(Matriz4d);
		void setRfoot(Matriz4d);

		void setLthigh(Matriz4d);
		void setLshank(Matriz4d);
		void setLfoot(Matriz4d);





        /*Metodos para obter informacoes do corpo do agente*/
		Coordenada3d getHeadAgentePosition();//devolve posicao da cabeça
		Coordenada3d getBodyAgentePosition();//devolve posicao do corpo

		Coordenada3d getRmupperarmAgentePosition(); //devolve posicao do braço superior direito
		Coordenada3d getRlowerarmAgentePosition(); //devolve posicao do ante-braço direito

		Coordenada3d getLmupperarmAgentePosition(); //devolve posicao do braço superior esquerdo
		Coordenada3d getLlowerarmAgentePosition();  //devolver posicao do ante-braço esquerdo

		Coordenada3d getRthighAgentePosition();  //devolver posicao da coixa direita
		Coordenada3d getRshankAgentePosition();  //devolver posicao da perna direita
		Coordenada3d getRfootAgentePosition();  //devolver posicao da pê direito

		Coordenada3d getLthighAgentePosition();  //devolve posicao da coixa esquerda
		Coordenada3d getLshankAgentePosition();  //devolve posicao da perna esquerda
		Coordenada3d getLfootAgentePosition();  //devolve posicao da pê esquerdo
		Coordenada3d getBollAgente();           //devolve posicao da bola no mesmo momento da posicao das juntas do agente

		Matriz4d     getParteAgente(int);
		Matriz4d     getBollM4();
		bool         getStatus();



		int          getNumero();               //devolve numero do robo
		std::string  getLado();
		double       getTimeAgene();            //devolve tempo
		int          getQuedas();               //devolve quantidade de quedas
		double       getTemcaido();            //devolve tempo que o agente ficou caido
		double       getTemInici();            //devolve tempo incial que o agente caio
		bool         getPosseBola();           //devolve true se o agente está em posso de bola
		std::string  getPlayMode();


		void         ListaCoordenadaCorpo();
		void         imprimNum();
        void         tostringPartAgent(Coordenada3d  );//imprime posicao da parte


	    void         addPosicoesAgente(Agente ); //adiciona posicoes do agente
	    void         getPosicoesAgente(); //devolve posicoes de um agente
	    std::vector<Agente> getVetorPosicoes();
	    Agente       retornLis();

	private:

		   /*Vetores com posicao das parte do agente*/
		    int          mNumero;
		    double       mTime;
		    std::string  lado;

		    std::vector<Agente> ListPosicao;
		    std::vector<Agente>::const_iterator i;

		    int  iqutQuedas;
		    double dtempo1, dtempIni, dtempfim;
		    double tempoCaido;
		    bool statusAgente, bcaido,posseBola;
		    std::string playMode;



		    Matriz4d mBallTransformAgente;

			Matriz4d mAgentTransformBody;// corpo
			Matriz4d mAgentTransformHead; //cabeça

			Matriz4d mAgentTransformRmupperarm ; //braço superior direito
			Matriz4d mAgentTransformRlowerarm ;  //Ante braço direito

			Matriz4d mAgentTransformLupperarm;  // Branco superior - esquerdo
			Matriz4d mAgentTransformLlowerarm; //ante Braço - esquerdo

			Matriz4d mAgentTransformRthigh;  //coxa direita
			Matriz4d mAgentTransformRshank;  // perna direita
			Matriz4d mAgentTransformRfoot;   // pe direito

			Matriz4d mAgentTransformLthigh;  //coxa esquerda
			Matriz4d mAgentTransformLshank; // perna esquerda
			Matriz4d mAgentTransformLfoot; // pe esquerdo





 };
#endif
